package com.zjl.redis.第02章_十大数据类型;

import com.zjl.redis.第01章_redis安装.RedisUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.ScanParams;
import redis.clients.jedis.resps.ScanResult;

/**
 * redis集合(Set)
 * Set (集合)
 * Redis的Set是String类型的无序集。集合成员是唯一的， 这就意味着集合中不能出现重复的数据，
 * 集合对象的编码可以是 intset 或者 hashtable.
 *
 * Redis中Set集合是通过哈希表实现的，所以添加，删除，查找的复杂度都是O(1)。
 * 集合中最大的成员数为2^32 - 1 (4294967295,每个集合可存储40多亿个成员)
 *
 */
public class B4_Set {
    /** set//不可重复  适合秒杀（一个人只能买一个）  set提供了某个成员是否在一个set集合里的重要接口
     *      1.sadd key value1 value2 //添加元素
     *      2.smembers key//获取key所有的值
     *        @see com.zjl.redis.第12章_大key引出的问题.C_模糊查询的命令 模糊查询指定 key的  value
     *      3.sismember key value//判断key是否有这个value//1：有     0：没有
     *      4.scard key//返回key有多少value
     *      5.srem key value1 value2//删除key的value//返回删除了几个
     *      6.spop key n//随机吐出n个值 删除  n默认为1
     *      7.srandmember key n//随机获取key的n个值 不删除
     *      8.smove k1 k2 value//把k1的value移动到k2中   k1的value必定消失相当于5+1
     *      9.sinter key1 key2//返回这两个集合的交集
     *          sinterstore newkey key1 key2//将  key1 key2 的交集 保存到 newkey
     *      10.sunion key1 key2//返回这两个集合的并集
     *          sunionstore newkey key1 key2//将  key1 key2 的并集 保存到 newkey
     *      11.sdiff key1 key2//返回这两个集合的差集  key1-key2
     *         sdiffstore newkey key1 key2//将  key1-key2 的差集 保存到 newkey
     *
     *      12.sinterCARD numkeys key1 key2 ... keyn limit n
     *        //redis7 新命令   返回 numkeys指定个数的key 的 交集 的value个数 limit默认最大 否则最大返回 n
     *
     *      13.smismember key value1 value2 ...valuen
     *        //redis6.2 新命令判断 key是否有这个value 返回数组//1：有     0：没有  f
     *
     *      14.SSCAN key cursor [MATCH pattern] [COUNT count]
     *          //redis2.8
     *          //key：需要遍历的集合或有序集合的键名。
     *          //cursor：遍历时的游标，第一次遍历时设为0，后续遍历时传入返回结果中的下一个游标。
     *                  用于往后遍历需要的数值，从0开始，这次返回的游标是下次遍历的游标，游标返回 0 表示遍历完毕
     *          //MATCH pattern：可选参数，用于指定匹配模式，只返回与模式匹配的元素。 pattern 可以为正则
     *          //COUNT count：可选参数，用于指定每次返回多少个元素，默认值为10。  现在没用/限制不了个数
     *         遍历 key 的 MATCH pattern  符合查询的正则 pattern：正则表达式  其他值没啥用
     *              127.0.0.1:6379> sscan s 0
     *              1) "0"  //游标
     *              2)  1) "1"   //数组
     *                  2) "2"
     *                 18) "erqwe"
     *                 19) "wfcsad"
     *                 20) "fasaq"
     *
     *
     *      //微信抽奖小程序   spop key//随机"吐出"一个值//最早以前和哈希一样其实有顺序  但是修改了
     *      //给别人朋友圈点赞   sadd key value1//点赞    srem key value1//取消点赞
     *      //微博好友关注社交关系
     *           共同关注的人   sinter key1 key2//返回这两个集合的交集
     *           我关注的某个人还有谁关注了 sismember key value//判断key是否有这个value//1：有     0：没有
     *      //qq内推的共同的好友
     *
     *      Java中HashSet的内部实现使用的是HashMap ,不过所有的value都指向同一个对象。
     *      Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
     *      Set数据结构是 dict 字典,字典是用哈希表实现的。
     */
    public static void main(String[] args) {

        Jedis jedis = RedisUtil.getRedis();
        System.currentTimeMillis();//获取当前时间戳
        System.out.println(jedis.ping());//查看是否连接成功  PONG:成功
        ScanParams scanParams = new ScanParams();
        scanParams.count(5);//限制不了
        scanParams.match("q*");
        //所有的 set  [1, 2, 3, a, b, c, qwer, qasd, qdfg, qw, qdfgg, werqwrwq, qweqwr, qwr, qwewq, e, qwe, erqwe, wfcsad, fasaq]
        ScanResult<String> s = jedis.sscan("s", "11",scanParams);
        System.out.println(s.getCursor());//一直都是0
        System.out.println(s.getResult());//根据 q* 查询后的[qwer, qasd, qdfg, qw, qdfgg, qweqwr, qwr, qwewq, qwe]

        jedis.close();
    }

}
